package cn.cocho.android.mc.file;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

/**
 * 图片压缩处理
 * 
 * @author HAIKANG SONG
 * @time 2013-4-19下午2:02:21
 */
public class ImageCompress {

	/**
	 * 将图片按指定的比率压缩
	 * 
	 * @param imgPath
	 *            图片路径
	 * @param rate
	 *            比率（如：8，则代表压缩为原来的1/8）
	 * @return 图片对象
	 * @author HAIKANG SONG
	 * @time 2013-4-19下午1:57:50
	 */
	public static Bitmap compressImage(String imgPath, int rate) {
		BitmapFactory.Options options = new BitmapFactory.Options();
		options.inSampleSize = rate;
		options.inJustDecodeBounds = false;
		return BitmapFactory.decodeFile(imgPath, options);
	}

	/**
	 * 将图片按照期待的宽度和高度压缩
	 * 
	 * @param imgPath
	 *            图片路径
	 * @param expectWidth
	 *            期待图片的宽度
	 * @param expectHeight
	 *            期待图片的高度
	 * @return 图片对象
	 * @author HAIKANG SONG
	 * @time 2013-4-19下午2:00:05
	 */
	public static Bitmap compressImage(String imgPath, int expectWidth, int expectHeight) {
		BitmapFactory.Options options = new BitmapFactory.Options();
		options.inSampleSize = getRate(imgPath, expectWidth, expectHeight);
		options.inJustDecodeBounds = false;
		return BitmapFactory.decodeFile(imgPath, options);
	}

	/**
	 * 获取图片压缩的比率
	 * 
	 * @param imgPath
	 *            图片路径
	 * @param expectWidth
	 *            期待的宽度
	 * @param expectHeight
	 *            期待的高度
	 * @return 算出比较合理的比率
	 * @author HAIKANG SONG
	 * @time 2013-4-19下午1:56:27
	 */
	private static int getRate(String imgPath, int expectWidth, int expectHeight) {
		BitmapFactory.Options options = new BitmapFactory.Options();
		/*
		 * 如果我们把它设为true，那么BitmapFactory.decodeFile(String path, Optionsopt)
		 * 并不会真的返回一个Bitmap给你， 它仅仅会把它的宽，高取回来给你，这样就不会占用太多的内存
		 */
		options.inJustDecodeBounds = true;
		BitmapFactory.decodeFile(imgPath, options);
		int height = options.outHeight;// 图片的实际高度
		int width = options.outWidth;// 图片的实际宽度
		int rate = 1;
		if (height > expectHeight || width > expectWidth) {
			int heightRatio = Math.round((float) height / (float) expectHeight);// 返回最接近参数的整数
			int widthRatio = Math.round((float) width / (float) expectWidth);
			rate = heightRatio < widthRatio ? heightRatio : widthRatio;
		}
		return rate;
	}

}
